From bacb111591d30c5928a545068ccba49ef5482850 Mon Sep 17 00:00:00 2001 From: "emellor@leeni.uk.xensource.com" Date: Sat, 22 Oct 2005 11:04:45 +0100 Subject: [PATCH] Reintroduce the changes made by changeset 7455:021324804fbd, which were disabled by workaround 7468:17a9f111fa93. We additionally need to set the FD_CLOEXEC flag on the status fd given to SrvServer when spawning the network script, as at least on some platforms this causes xend to fail to start properly. Signed-off-by: Ewan Mellor --- tools/python/xen/util/process.py | 39 ----------------------- tools/python/xen/xend/Vifctl.py | 6 ++-- tools/python/xen/xend/server/SrvServer.py | 6 ++++ 3 files changed, 8 insertions(+), 43 deletions(-) delete mode 100644 tools/python/xen/util/process.py diff --git a/tools/python/xen/util/process.py b/tools/python/xen/util/process.py deleted file mode 100644 index 9117ef4ded..0000000000 --- a/tools/python/xen/util/process.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 2005 Christian Limpach - -# os.system() replacement which outputs through the logger - -import popen2 -import select -import string - -from xen.xend.XendLogging import log - -def runscript(cmd): - # split after first space, then grab last component of path - cmdname = "[%s] " % cmd.split()[0].split('/')[-1] - # run command and grab stdin, stdout and stderr - cout, cin, cerr = popen2.popen3(cmd) - # close stdin to get command to terminate if it waits for input - cin.close() - # wait for output and process - p = select.poll() - p.register(cout) - p.register(cerr) - stdout = "" - while True: - r = p.poll() - for (fd, event) in r: - if event == select.POLLHUP: - cout.close() - cerr.close() - return stdout - if fd == cout.fileno(): - stdout = stdout + cout.readline() - if fd == cerr.fileno(): - l = cerr.readline() - if l[0] == '-': - log.debug(cmdname + l[1:].rstrip()) - elif l[0] == '*': - log.info(cmdname + l[1:].rstrip()) - else: - log.error(cmdname + l.rstrip()) diff --git a/tools/python/xen/xend/Vifctl.py b/tools/python/xen/xend/Vifctl.py index fe37dfc506..382cba5c04 100644 --- a/tools/python/xen/xend/Vifctl.py +++ b/tools/python/xen/xend/Vifctl.py @@ -20,9 +20,9 @@ """ import os -import xen.util.process import XendRoot + def network(op): """Call a network control script. @@ -32,6 +32,4 @@ def network(op): raise ValueError('Invalid operation: ' + op) script = XendRoot.instance().get_network_script() if script: - xen.util.process.runscript(script + " " + op) - #os.spawnl(os.P_WAIT, script, script, op) - + os.spawnl(os.P_WAIT, script, script, op) diff --git a/tools/python/xen/xend/server/SrvServer.py b/tools/python/xen/xend/server/SrvServer.py index 4a4f9f4946..576de6be16 100644 --- a/tools/python/xen/xend/server/SrvServer.py +++ b/tools/python/xen/xend/server/SrvServer.py @@ -39,6 +39,7 @@ # todo Support security settings etc. in the config file. # todo Support command-line args. +import fcntl from threading import Thread from xen.web.httpserver import HttpServer, UnixHttpServer @@ -64,6 +65,11 @@ class XendServers: self.servers.append(server) def start(self, status): + # Running the network script will spawn another process, which takes + # the status fd with it unless we set FD_CLOEXEC. Failing to do this + # causes the read in SrvDaemon to hang even when we have written here. + fcntl.fcntl(status, fcntl.F_SETFD, fcntl.FD_CLOEXEC) + Vifctl.network('start') threads = [] for server in self.servers: -- 2.30.2